package com.zxlspace.thread;

/**
 * 一个场景，共同资源
 * 生产者 消费者模式 信号灯法
 * wait(object类下) ：等待，释放锁 ；sleep 不释放锁
 * notify()/notifyAll() 唤醒线程
 * 和synchronized 一起使用
 */
public class Movie {
    private String pic;
    //信号灯
    //flag ---> true 生产者生产，消费者等待生产完成后通知消费
    //flag ---> false 消费者消费，生产者等待，消费完成后通知生产
    private boolean flag = true;

    public synchronized void play(String pic) {
        if (!flag) { //生产者等待
            try {
                this.wait();  //当前线程等待，释放锁
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

        //开始生产
        try {
            Thread.sleep(500);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println("生产了：" + pic);

        //生产完毕
        this.pic = pic;
        //通知消费
        this.notify();
        //生产者停止
        this.flag = false;
    }

    public synchronized void watch() {
        if (flag) {  //消费者等待
            try {
                this.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

        //开始消费
        try {
            Thread.sleep(200);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        //消费完毕
        System.out.println("消费了:" + pic);

        //通知生产
        this.notifyAll();
        //消费者停止
        this.flag = true;
    }
}
